/* my style pagination control */
function calcCurrentPage(oSettings) {
    return Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
}

function calcPages(oSettings) {
    return Math.ceil(oSettings.fnRecordsDisplay() / oSettings._iDisplayLength);
}

$.fn.dataTableExt.oPagination.my_pagination = {
    "fnInit": function (oSettings, nPaging, fnCallbackDraw) {
        var language = oSettings.oLanguage.oPaginate;
        var fnClickHandler = function (e) {
            e.preventDefault();
            if (oSettings.oApi._fnPageChange(oSettings, e.data.action)) {
                fnCallbackDraw(oSettings);
            }
        };
        $(nPaging).addClass('pagination').append(
            '<ul class="pagination" style="font-weight: bold;">' +
            '<li class="page-item first disabled"><a class="page-link" href="#">' + language.sFirst + '</a></li>' +
            '<li class="page-item prev disabled"><a class="page-link" href="#">' + language.sPrevious + '</a></li>' +
            '<li class="page-item input"><input class="page-link redirect" type="text" style="text-align: center; width: 4em;"></li>' +
            '<li class="page-item next disabled"><a class="page-link" href="#">' + language.sNext + '</a></li>' +
            '<li class="page-item last disabled"><a class="page-link" href="#">' + language.sLast + '</a></li>' +
            '</ul>'
        );
        //datatables分页跳转
        $(nPaging).find(".redirect").focusout(function (e) {
            var iPage = parseInt($(this).val());
            var iPages = calcPages(oSettings);
            var iCurrentPage = calcCurrentPage(oSettings);
            var timer = null;
            if (isNaN(iPage) || iPage < 1) {
                iPage = 1;
            } else if (iPage > iPages) {
                iPage = iPages;
            }
            $(this).val(iPage);
            iPage--;
            oSettings._iDisplayStart = iPage * oSettings._iDisplayLength;
            clearTimeout(timer);
            timer = setTimeout(function () {
                fnCallbackDraw(oSettings);
            }, 600);
        });
        var els = $('a', nPaging);
        $(els[0]).bind('click.DT', {
            action: "first"
        }, fnClickHandler);
        $(els[1]).bind('click.DT', {
            action: "previous"
        }, fnClickHandler);
        $(els[2]).bind('click.DT', {
            action: "next"
        }, fnClickHandler);
        $(els[3]).bind('click.DT', {
            action: "last"
        }, fnClickHandler);
    },
    "fnUpdate": function (oSettings, fnCallbackDraw) {
        var iPages = calcPages(oSettings);
        var iCurrentPage = calcCurrentPage(oSettings);
        var an = oSettings.aanFeatures.p;
        for (var i = 0, ien = an.length; i < ien; i++) {
            // Add / remove disabled classes from the static elements
            if (iCurrentPage === 1) {
                $('li:lt(2)', an[i]).addClass('disabled');
            } else {
                $('li:lt(2)', an[i]).removeClass('disabled');
            }
            if (iCurrentPage === iPages || iPages === 0) {
                $('.next', an[i]).addClass('disabled');
                $('li:last', an[i]).addClass('disabled');
            } else {
                $('.next', an[i]).removeClass('disabled');
                $('li:last', an[i]).removeClass('disabled');
            }
            $('.input', an[i]).find('input').val(iCurrentPage);
        }
    }
}

// 设置默认值
$.extend($.fn.dataTable.defaults, {
    autoWidth: true,// 启用自动列宽计算（可以通过columns.width指定每个列的宽度）
    deferRender: false,// 延迟渲染（后端分页，故不需要延迟渲染）
    info: true,// 显示已过滤数据的信息（多少页，多少条）
    lengthChange: true,// 允许修改每页显示数
    ordering: true,// 启用字段排序（可以通过columns.orderable每个列的选项禁用添加或删除单个列排序的功能）
    paging: true,// 启用分页
    processing: true,// 获取数据时显示加载中
    scrollX: false,// 当表格数据超出水平宽度时，显示水平滚动条
    scrollY: 500,// 指定表格高度，超出时显示滚动条
    searching: false,// 禁用过滤控件
    serverSide: true,// 启用服务器端分页
    stateSave: true,// 启用或禁用状态保存。启用后，aDataTables将存储状态信息，例如分页位置，显示长度，过滤和排序。当最终用户重新加载页面时，表的状态将被更改以匹配他们先前设置的状态。
    deferLoading: null,// 不使用将服务器端数据的加载延迟到第二次绘制
    destroy: false,// 如果不更改 table 属性，不需要开启；开启后对于同一个table会先消耗再创建新table
    displayStart: 0,// 初始分页开始点
    dom: "<'row'<'col-sm-12'tr>><'row'<'col-auto mr-auto'p><'col-auto'<'d-inline-block mr-2'l><'d-inline-block'i>>>",
    lengthMenu: [// 每页显示多少条选项
        [10, 25, 50, 100], // 数值
        [10, 25, 50, 100]  // 显示的文字
    ],
    order: [[0, 'asc']],// 如果启用了排序（ordering），则DataTables将在初始化期间执行首个通过顺序。使用此参数，您可以定义要指定排序的列以及排序方向。
    orderCellsTop: false,// 复杂表头排序再考虑是否开启
    orderClasses: true,// 添加一个 class 样式突出排序列
    orderFixed: null,// 指定固定排序列
    orderMulti: true,// 允许按 Shift 选择多列进行排序
    pageLength: 10,// 使用分页时在单个页面上显示的行数
    pagingType: "my_pagination",// 分页按钮的显示类型
    renderer: "bootstrap",// 指定渲染组件的样式
    retrieve: false,// 如果表已经初始化，则此参数将导致DataTables仅返回已设置的对象-它不会考虑您可能会对传递给DataTables的初始化对象进行的任何更改
    rowId: "DT_RowId",// 指定行的 id 列
    scrollCollapse: false, // 当显示有限数量的行时，允许表格降低高度
    search: null,// 设置初始过滤条件
    searchCols: [],// 不为单个列指定默认过滤条件
    searchDelay: null,// 立即搜索
    stateDuration: 7200,// 保存状态有效期，单位：秒
    stripeClasses: ['odd', 'even'],// 为表中的行设置斑马条纹类名称
    tabIndex: 0,// 用于键盘导航的选项卡索引控件
    language: {
        aria: {
            paginate: {
                first: "首页",
                previous: "上一页",
                next: "下一页",
                last: "末页"
            },
            sortAscending: "activate to sort column ascending",
            sortDescending: "activate to sort column descending"
        },
        decimal: "",// 小数位字符
        emptyTable: "暂无记录",// 表没有记录
        info: "| 共 _PAGES_ 页 | 共 _TOTAL_ 条",// 表的信息
        infoEmpty: "| 共 0 页 | 共 0 条",// 当表中没有记录时使用的表摘要信息
        infoFiltered: "",// 筛选表时，将字符串附加到摘要信息
        infoPostFix: "",// 附加到所有其他摘要信息字符串的字符串
        lengthMenu: "每页显示 _MENU_ 条记录",// 页面长度选项字符串
        loadingRecords: "数据加载中...",// 加载信息显示字符串-在Ajax加载数据时显示
        paginate: {
            first: '<i class="fas fa-angle-double-left"></i>',
            previous: '<i class="fas fa-angle-left"></i>',
            next: '<i class="fas fa-angle-right"></i>',
            last: '<i class="fas fa-angle-double-right"></i>'
        },
        processing: "数据处理中...",// 当表正在处理用户操作（通常是排序命令或类似命令）时显示的文本
        search: "查询",// 搜索输入字符串
        searchPlaceholder: "",// 搜索输入元素的占位符属性，在输入控件无值时提供信息文本
        thousands: "",// 千位分隔符
        url: "",// 从远程文件加载语言信息
        zeroRecords: "暂无记录"// 由于过滤字符串，表为空时显示的字符串
    }
});

var myDataTable = function (selector, url, params, options) {
    var defaultOptions = {
        "ajax": {
            "url": url,
            "contentType": "application/json",
            "type": "POST",
            "data": function (d) {
                d.params = params;
                return JSON.stringify(d);
            }
        }
    };
    var tableOptions = options ? $.extend(defaultOptions, options) : defaultOptions;
    return $(selector).DataTable(tableOptions);
}